package config

import (
	"fmt"
	"os"

	"gopkg.in/yaml.v3"
)

type Config struct {
	COS struct {
		SECRETID  string `yaml:"secretId"`
		SECRETKEY string `yaml:"secretKey"`
		BUCKET    string `yaml:"bucket"`
		BUCKETURL string `yaml:"bucketUrl"`
		ENDPOINT  string `yaml:"endpoint"`
	} `yaml:"cos"`
	Database struct {
		Host     string `yaml:"host"`
		Port     int    `yaml:"port"`
		User     string `yaml:"user"`
		Password string `yaml:"password"`
		Database string `yaml:"database"`
		Charset  string `yaml:"charset"`
	} `yaml:"database"`
	JWT struct {
		SECRET string `yaml:"secret"`
		EXPIRE int    `yaml:"expire"` // 过期时间（小时）
	} `yaml:"jwt"`
}

// NewConfig 创建新的配置实例
// cosProfile: COS配置的profile (如: zyx, zsh)
// dbEnv: 数据库环境 (如: dev, product)
func NewConfig(cosProfile, dbEnv string) (*Config, error) {
	cfg := &Config{}

	// 读取配置文件
	data, err := os.ReadFile("config/config.yml")
	if err != nil {
		return nil, fmt.Errorf("读取配置文件失败: %v", err)
	}

	// 解析 YAML
	var rawConfig map[string]interface{}
	if err := yaml.Unmarshal(data, &rawConfig); err != nil {
		return nil, fmt.Errorf("解析配置文件失败: %v", err)
	}

	// 获取指定cosProfile的配置
	cosConfig, ok := rawConfig["cos"].(map[string]interface{})
	if !ok {
		return nil, fmt.Errorf("配置文件格式错误: 缺少cos配置")
	}

	profileConfig, ok := cosConfig[cosProfile].(map[string]interface{})
	if !ok {
		return nil, fmt.Errorf("配置文件中未找到cosProfile: %s", cosProfile)
	}

	// 填充COS配置结构体
	if secretId, ok := profileConfig["SECRETID"].(string); ok {
		cfg.COS.SECRETID = secretId
	}
	if secretKey, ok := profileConfig["SECRETKEY"].(string); ok {
		cfg.COS.SECRETKEY = secretKey
	}
	if bucket, ok := profileConfig["BUCKET"].(string); ok {
		cfg.COS.BUCKET = bucket
	}
	if bucketUrl, ok := profileConfig["BUCKETURL"].(string); ok {
		cfg.COS.BUCKETURL = bucketUrl
	}
	if endpoint, ok := profileConfig["ENDPOINT"].(string); ok {
		cfg.COS.ENDPOINT = endpoint
	}

	// 获取数据库配置
	databaseConfig, ok := rawConfig["database"].(map[string]interface{})
	if !ok {
		return nil, fmt.Errorf("配置文件格式错误: 缺少database配置")
	}

	dbConfig, ok := databaseConfig[dbEnv].(map[string]interface{})
	if !ok {
		return nil, fmt.Errorf("配置文件中未找到数据库环境: %s", dbEnv)
	}

	// 填充数据库配置结构体
	if host, ok := dbConfig["host"].(string); ok {
		cfg.Database.Host = host
	}
	if port, ok := dbConfig["port"].(int); ok {
		cfg.Database.Port = port
	}
	if user, ok := dbConfig["user"].(string); ok {
		cfg.Database.User = user
	}
	if password, ok := dbConfig["password"].(string); ok {
		cfg.Database.Password = password
	}
	if database, ok := dbConfig["database"].(string); ok {
		cfg.Database.Database = database
	}
	if charset, ok := dbConfig["charset"].(string); ok {
		cfg.Database.Charset = charset
	}

	// 获取JWT配置
	jwtConfig, ok := rawConfig["jwt"].(map[string]interface{})
	if ok {
		if secret, ok := jwtConfig["SECRET"].(string); ok {
			cfg.JWT.SECRET = secret
		} else {
			// 默认JWT密钥
			cfg.JWT.SECRET = "inNTU_admin_secret_key"
		}
		
		if expire, ok := jwtConfig["EXPIRE"].(int); ok {
			cfg.JWT.EXPIRE = expire
		} else {
			// 默认过期时间24小时
			cfg.JWT.EXPIRE = 24
		}
	} else {
		// 默认JWT配置
		cfg.JWT.SECRET = "inNTU_admin_secret_key"
		cfg.JWT.EXPIRE = 24
	}

	return cfg, nil
}
